/**
  ******************************************************************************
  * @file    ring_queue.h
  * @author  ashuai0110
  * @version V2.1
  * @date    2023-09-24
  * @brief   环形队列
  *          (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入)
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __RING_QUEUE_H
#define __RING_QUEUE_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"

/**
 * @addtogroup modules
 * @{
 */

/**
 * @addtogroup ring_queue
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup ring_queue_global_types ring queue global types
 * @{
 */

/** 
  * @brief  环形队列 structure definition
  */
typedef struct ring_queue {
    char *pHead;     /*!< 环形队列头节点(开始读节点) */
    char *pTail;     /*!< 环形队列尾节点(开始写节点) */
    char *pBuf;      /*!< 环形队列数据缓存区 */
    uint32_t curCnt; /*!< 环形队列数据当前存储数量(byte) */
    uint32_t maxCnt; /*!< 环形队列数据最大存储数量(byte) */
} ring_queue_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup ring_queue_global_functions
 * @{
 */

void ring_queue_init(ring_queue_t* _rq, void *pBuf, uint32_t size);
void ring_queue_de_init(ring_queue_t *_rq);

uint32_t ring_queue_total_size(ring_queue_t *_rq);
uint32_t ring_queue_can_read(ring_queue_t *_rq);
uint32_t ring_queue_can_write(ring_queue_t *_rq);

uint8_t ring_queue_read(ring_queue_t *_rq, void *pBuf, uint32_t size);
uint8_t ring_queue_write(ring_queue_t *_rq, void *pData, uint32_t size);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* ring_queue.h */
